package immutablecollections.functions;

import immutablecollections.*;

class FunctionNImpl<O> implements FunctionN<O>
{

    final private Invoker<O> invoker;

    public FunctionNImpl(Invoker<O> invoker)
    {
        this.invoker = invoker;
    }

    public FunctionNImpl(Object firstArg, Invoker<O> invoker)
    {
        this(new DelegateInvoker<O>(invoker, firstArg));
    }

    @Override
    public O invokeFully(Object... args)
    {
        return invoker.invoke(ImList.onArray(args));
    }

    @Override
    public FunctionN<O> invokePartially(Object arg)
    {
        return new FunctionNImpl<O>(new DelegateInvoker<O>(invoker, arg));
    }

    @Override
    public String toString()
    {
        return invoker.toString();
    }
}
